home *** CD-ROM | disk | FTP | other *** search
/ Revista do CD-ROM 85 / CD-ROM 85 / CD-ROM 85.iso / med2000 / js / menulist.js < prev    next >
Encoding:
JavaScript  |  2001-04-19  |  4.5 KB  |  164 lines

  1. // MenuList Object
  2. // a cascading menu widget utilizing the List Object
  3. // 19990326
  4.  
  5. // Copyright (C) 1999 Dan Steinman
  6. // Distributed under the terms of the GNU Library General Public License
  7. // Available at http://www.dansteinman.com/dynapi/
  8.  
  9. // Thanks to: Knut Dale <Knut.S.Dale@eto.ericsson.se>
  10.  
  11. function MenuList() {
  12.     // main-menu constructor (x,y,width,itemH)
  13.     // sub-menu constructor (parentMenu,parentItemIndex)
  14.  
  15.     this.name = "MenuList"+(MenuList.count++)
  16.     this.obj = this.name + "MenuListObject"
  17.     eval(this.obj + "=this")
  18.     if (arguments.length==4) {
  19.         this.isChild = false
  20.         this.x = arguments[0]
  21.         this.y = arguments[1]
  22.         this.w = arguments[2]
  23.         this.itemH = arguments[3]
  24.         this.subOnSelect = false
  25.         this.offsetX = -1
  26.         this.offsetY = this.itemH/2
  27.     }
  28.     else {
  29.         this.isChild = true
  30.         this.parent = arguments[0]
  31.         var index = arguments[1]
  32.         this.parent.list.items[index].hasImage = true
  33.         this.parent.list.items[index].hasChild = true
  34.         this.parent.list.items[index].child = this
  35.         this.x = this.parent.w
  36.         this.y = this.parent.list.items[index].y
  37.         this.w = (arguments.length==3)? arguments[2] : this.parent.w
  38.         this.itemH = this.parent.itemH
  39.         this.childShown = null
  40.         this.subOnSelect = this.parent.subOnSelect
  41.         this.offsetX = this.parent.offsetX
  42.         this.offsetY = this.parent.offsetY
  43.     }
  44.  
  45.     this.visibility = 'inherit'
  46.     this.zIndex = null
  47.     this.overOpen = false
  48.     
  49.     this.list = new List(1,1,this.w-2,this.itemH)
  50.     this.list.visibility = 'inherit'
  51.     this.list.allowDeselect = true
  52.     this.list.menulist = this
  53.     
  54.     if (this.isChild) {
  55.         this.list.image = this.parent.list.image
  56.         this.list.color = this.parent.list.color
  57.         this.list.itemSpacing = this.parent.list.itemSpacing
  58.         this.list.fontname = this.parent.list.fontname
  59.         this.list.fontsize = this.parent.list.fontsize
  60.     }
  61.     
  62.     this.cssChildren = ''
  63.     this.divChildren = ''
  64.  
  65.     this.build = MenuListBuild
  66.     this.activate = MenuListActivate
  67.     this.showMenu = MenuListShowMenu
  68.     this.hideMenu = MenuListHideMenu
  69.     this.show = MenuListShow
  70.     this.hide = MenuListHide
  71.     this.toggle = MenuListToggle
  72.     this.select = MenuListSelect
  73.     if (this.isChild) this.onSelect = this.parent.onSelect
  74.     else this.onSelect = new Function()
  75. }
  76. function MenuListBuild(write) {
  77.     for (var i=0;i<this.list.items.length;i++) {
  78.         if (this.list.items[i].hasChild) {
  79.             this.list.items[i].child.overOpen = this.overOpen
  80.             this.list.items[i].child.build()
  81.         }
  82.     }
  83.     this.list.overOpen = this.overOpen
  84.     this.list.build()
  85.     this.css = css(this.name,(this.x/2)+this.offsetX,this.y+this.offsetY,null,null,null,(this.isChild)?'hidden':this.visibility,this.zIndex)+
  86.     css(this.name+'ListW',0,0,this.w,this.list.h+2,'black')+
  87.     this.list.css+
  88.     this.cssChildren
  89.  
  90.     this.div = '<div id="'+this.name+'">\n'+
  91.     '<div id="'+this.name+'ListW">\n'+
  92.     this.list.div+
  93.     '</div>\n'+
  94.     this.divChildren+
  95.     '</div>\n'
  96.  
  97.     if (this.isChild) {
  98.         this.parent.cssChildren += this.css
  99.         this.parent.divChildren += this.div
  100.     }
  101. }
  102. function MenuListActivate() {
  103.     this.list.activate()
  104.     this.lyr = new DynLayer(this.name)
  105.     this.h = this.list.h+2
  106.     if (is.ns && !this.isChild) {
  107.         this.lyr.clipInit()
  108.         this.lyr.clipTo(0,this.w,this.h,0)
  109.     }
  110.     this.list.onSelect = new Function(this.obj+'.select(); return false;')
  111.     for (var i=0;i<this.list.items.length;i++) {
  112.         if (this.list.items[i].hasChild) this.list.items[i].child.activate()
  113.     }
  114. }
  115. function MenuListSelect() {
  116.     var i = this.list.selectedIndex
  117.     if (i!=null) {
  118.     if (this.childShown==i) {
  119.         this.hideMenu(this.childShown)
  120.     }
  121.     else {
  122.         this.hideMenu()
  123.         if (this.list.items[i].hasChild) this.showMenu(i)
  124.         if (!this.list.items[i].hasChild || this.subOnSelect) this.onSelect()
  125.     }
  126.     }
  127. }
  128. function MenuListHideMenu() {
  129.     var i = this.childShown
  130.     if (i!=null && this.list.items[i]!=null) {
  131.         this.childShown = null
  132.         this.list.items[i].child.lyr.hide()
  133.         this.list.items[i].child.hideMenu()
  134.         if (this.list.items[i].child.list.selectedIndex!=null) {
  135.             this.list.items[i].child.list.deselect(this.list.items[i].child.list.selectedIndex)
  136.         }
  137.         if (is.ns && !this.isChild) this.lyr.clipTo(0,this.w,this.h,0)
  138.     }
  139. }
  140. function MenuListShowMenu(i) {
  141.     if (is.ns && !this.isChild) this.lyr.clipTo(0,this.lyr.w,this.lyr.h,0)
  142.     this.list.items[i].child.lyr.show()
  143.     this.childShown = i
  144. }
  145. function MenuListToggle() {
  146.     if (!this.visible) this.show()
  147.     else this.hide()
  148. }
  149. function MenuListHide() {
  150.     this.hideMenu()
  151.     this.list.deselect(this.list.selectedIndex)
  152.     this.lyr.hide()
  153.     this.visible = false
  154. }
  155. function MenuListShow() {
  156.     this.lyr.css.visibility = 'inherit'
  157.     this.visible = true
  158. }
  159. function MenuListRedirect() {
  160.     this.hide()
  161.     location.href = this.list.value
  162. }
  163. MenuList.count = 0
  164.